#include <stdio.h>

//链表
struct ListArray
{
    struct ListArray * pre;
    struct ListArray * next;
    float num;
    float price;
};


int main(){
    float ** shuruArray;
    float d1,c,d2,p;

    int n,i;
    scanf("%f %f %f %f %d",&d1,&c,&d2,&p,&n);
    shuruArray=new float*[n+2];
    //起点
    shuruArray[0]=new float[2];
    shuruArray[0][0]=0;
    shuruArray[0][1]=p;

    for(i=1;i<=n;i++)
    {
        shuruArray[i]=new float[2];
        scanf("%f %f",&shuruArray[i][0],&shuruArray[i][1]);
    }
    n+=2;

    //终点
    shuruArray[n-1]=new float[2];
    shuruArray[n-1][0]=d1;
    shuruArray[n-1][1]=0;

    //加满油最大行驶距离
    float maxjl=c*d2;
    //最大汽油消耗
    // float maxQ=d1/d2;
    int flag=1;

    //检查可以通行吗

    for(i=1;i<n;i++)
    {
        float jl=shuruArray[i][0]-shuruArray[i-1][0];
        if(jl>maxjl)
        {
            flag=0;
            break;
        }
    }

    if(flag)
    {
        ListArray* start=NULL,*end=NULL;
        float allGas=0;
        float price=0;
        for(i=0;i<n;i++)
        {
            ListArray* tmp=end;
            //退货 退油价大于当前油价的汽油
            while (tmp!=NULL)
            {
                if(tmp->price>shuruArray[i][1])
                {
                    price-=tmp->num*tmp->price;
                    allGas-=tmp->num;

                    end=tmp->pre;
                    if(end!=NULL)
                    {
                        end->next=NULL;
                    }
                    
                    delete tmp;  
                    tmp=end;
                }
                else{
                    break;
                }
            }

            if(end==NULL)
            {
                start=NULL;
            }
            
            //加满油箱
            float add=c-allGas;
            allGas=c;
            price+=add*shuruArray[i][1];
            ListArray* newItem=new ListArray;
            
            newItem->num=add;
            newItem->price=shuruArray[i][1];
            newItem->next=NULL;
            newItem->pre=NULL;

            //将新加的油插到尾部 因为大于改点油价的油都退货了
            if(end==NULL)
            {
                start=newItem;
                end=newItem;
            }
            else{
                end->next=newItem;
                newItem->pre=end;
                end=newItem;
                
            }

            //跑到下个点消耗的汽油 优先消耗油价最低的油
            if(i<n-1)
            {
                float xh=(shuruArray[i+1][0]-shuruArray[i][0])/d2;
                allGas-=xh;
                tmp=start;
                while (tmp!=NULL)
                {
                    if(tmp->num<=xh)
                    {
                        xh-=tmp->num;
                        start=tmp->next;
                        if(start!=NULL)
                        {
                            start->pre=NULL;
                        }
                        delete tmp;
                        tmp=start;
                    }
                    else{
                        tmp->num-=xh;
                        xh=0;
                        break;
                    }

                }

                if(start==NULL)
                {
                    end=NULL;
                }
                
                
            }

            // printf("%.2f\n",price);
        }

        price=((int)(price*100+0.5f))/100.0f;
        printf("%.2f\n",price);
    }
    else{
        printf("No Solution\n");
    }

    for(i=0;i<n;i++)
    {
        delete shuruArray[i];
    }
    delete shuruArray;
    return 0;
}